package com.example.bigdata.scala.集合

import scala.collection.mutable

object MapDemo {
  def main(args: Array[String]): Unit = {

    MapInit()
  }

  def MapInit(): Unit ={

    var colors = Map("red" -> "#FF0000", "azure" -> "#F0FFFF", "peru" -> "#CD853F")
    println( "Keys in colors : " + colors.keys )
    println( "Values in colors : " + colors.values )
    println( "Check if colors is empty : " + colors.isEmpty )

    //引用可变,支持读写操作;
    var map = Map[String,String]("name" -> "jason","age" -> "500","test_100" -> "test_100","test_101" -> "test_101")
    //新增
    map += ("city" -> "北京")
    println(map)

    val map2 =Map[String,String]("sex" -> "男","brand" -> "apple")
    println(map2)

    val map3 = mutable.Map[String,String]()
    // += 格式 ( xx -> xx ) 可添加一个或多个元素
    map3 += ("test" -> "能添加么")
    map3 += ("test" -> "会更新么","再来添加一个" -> "xxxx")
    // put 格式  (xxx,xxx)  只能添加一个元素
    map3.put("2","2")

    println("map3 " + map3)
    println("map3.keys\t" + map3.keys)
    println("map3.values\t"+ map3.values)
    println("map3.isEmpty\t" + map3.isEmpty)

    //合并两个map

    var combineMap = map ++ map2
    println("combineMap\t"+combineMap)
    //删除指定key
    combineMap -= ("city","name")
    println("combineMap\t"+combineMap)
    //获取指定key 的值
    println("combineMap.get(\"age\")\t"+ combineMap.get("age").get)
    // 返回所有元素，除了最后一个
    println("combineMap.init\t"+combineMap.init)
    // 获取最后一个元素
    println("combineMap.last\t"+combineMap.last)

    // 获取最大元素
    println("combineMap.max\t"+combineMap.max)

    // 获取最小元素
    println("combineMap.min\t"+combineMap.min)

    //以字符串形式 输出所有元素
    println("combineMap.mkString\t"+combineMap.mkString(""))

    println("combineMap.size\t"+combineMap.size)

    //转换成数组
    println("combineMap.toArray\t"+combineMap.toArray)

    //返回缓冲区,包含了Map的所有元素;
    println("combineMap.toBuffer\t"+combineMap.toBuffer)

    //返回List,包含了Map的所有元素;
    println("combineMap.toList\t"+combineMap.toList)

    //根据key取value值,如果不存在返回后面的值;
    println("combineMap.get(\"xxx\").getOrElse(\"yyy\")\t"+combineMap.get("xxx").getOrElse("yyy"))


    val keySet = combineMap.keys
    val key_iter = keySet.iterator
    while (key_iter.hasNext){
      val key = key_iter.next()
      println(key + ":" +combineMap.get(key).get)

    }

    //返回指定键的值，如果不存在 返回 map 的默认方法
    println("combineMap.apply(\"test_100\")\t"+combineMap.apply("test_100"))

    //如果map中存在指定 key,返回 true，否则返回 false;
    println("combineMap.contains(\"test_110\")\t"+combineMap.contains("test_110"))

    //计算满足指定条件的集合元素数量;
    val age_count = combineMap.count(
      x=>{
        x._1.equals("age")
      }
    )
    println("age_count\t"+age_count)
    //返回丢弃最后n个元素新集合;
    val map_drop = combineMap.drop(1)
    println("map_drop\t"+map_drop)

    //返回相同类型的空map
    println(combineMap.empty)
    // 两个Map相等 (key/value 均相等) ,返回 true 否则返回 false
    println("map.equals(map2)\t"+map.equals(map2))

    //判断集合指定元素是否存在
    println("combineMap.exists: value 男\t"+
      combineMap.exists( x=>{
        x._2.equals("男")
      })
    )
    // filter 过滤 key 长度大于   4 的 结果
    println( "filter 过滤 key 长度大于4 的结果\t" +
      combineMap.filter(x=>{
        x._1.length()>4
      })
    )

    //返回符合指定条件的不可变 Map;
    println("filterKeys 过滤 key 为 test_100 的结果集 \t"+
      combineMap.filterKeys(x=>{
        x.equals("test_100")
      })
    )
    //查找 集合中满足条件的第一个元素
    println("查找 key == value 的元素"+
      combineMap.find(x=>{
      x._1.equals(x._2)
    }).get)

    //循环Map 里的所有元素

    println("遍历Map 001 所有元素\t" +
      combineMap.foreach(x=>{
        println( x._1 + ":" + x._2)
      })
    )

    println("\n遍历Map 002 所有元素\t" +
      combineMap.foreach( x=>{
      val (k,v) = x ;
      println(k + ":" +v)
    }))

    //遍历Map 集合
    for((k,v) <- combineMap){
      println(k + ":" + v)
    }

  }
}
